RealTime-Glo vs direct cell counts via fluorescence microscopy

Analysis of PC9.1 cells treated with multiple drugs and drug concentrations using RT-glo.

Columns 3-22 have RT-glo, other do not.
O13-22 should be controls.

library(diprate)

# New function to correct time format
# Example time: 12-17-2021 5:22 PM

fixTime <- function(...) strptime(format="%m-%d-%Y %I:%M %p", ...)

d <- read.csv("~/dropbox-vu/temp/lum_cellcount_JAB002-3.csv", row.names=1)

Clean up data

d[d$drug_conc == "NaN", "drug_conc"] <- NA
d$drug_conc <- as.numeric(d$drug_conc)
d[d$drug == "", "drug"] <- NA

cn <- colnames(d)

cn <- gsub("drug_", "drug1.", cn)
cn <- gsub("drug$", "drug1", cn)
cn <- gsub("_", ".", cn)
colnames(d) <- cn

d[is.na(d$drug1.conc), "drug1.conc"] <- 0

TxTime <- fixTime(min(d$image.time))
d$time <- signif(as.numeric(difftime(fixTime(d$image.time), TxTime, units="hours")),3)
d <- d[order(d$well,d$time),]
d$uid <- d$well
rownames(d) <- NULL

# drop first two time points
d <- d[d$plate.id > 2,]
ctrl <- d[d$well %in% paste0("O",13:22),]
temp <- plotGC(ctrl$time, ctrl$cell.count, ctrl$well, main="Cell counts")

temp <- plotGC(ctrl$time, ctrl$RLU, ctrl$well, main="Luminescence")

plot(RLU ~ cell.count, data=ctrl)

drugs <- unique(d$drug1)
drugs <- drugs[!is.na(drugs)]

a <- lapply(drugs, function(dr) d[d$drug1==dr & !is.na(d$drug1),])
par(mfrow=c(3,3))
temp <- lapply(a, function(z) do.call(plotGC, append(getGCargs(z), list(rep=z$drug1.conc, main=unique(z$drug1)))))

par(mfrow=c(3,3))
temp <- lapply(a, function(z) do.call(plotGC, append(getGCargs(z, 
                                                               arg.name = c("time", "cell.count", "ids"), 
                                                               dat.col = c("time", "RLU", "uid")), 
                                      list(rep=z$drug1.conc, main=unique(z$drug1)))))

plotLin <- function (x, y, ids, rep = ids, color = TRUE, leg = TRUE, ...) 
{
    urep <- unique(rep)
    ifelse(color, rep.col <- gplots::colorpanel(n = length(urep), 
        low = "blue", mid = "orange", high = "red"), rep.col <- rep("black", 
        length(urep)))
    plot(x, y, type = "n", ...)
    for (myrep in urep) for (i in unique(ids)) 
        lines(x[ids == i & rep == myrep], 
              y[ids == i & rep == myrep], 
              col = rep.col[match(myrep, urep)])
    if (leg) 
        legend("topleft", legend = urep, col = rep.col, lwd = 1)
    return(NULL)
}
par(mfrow=c(3,3))
temp <- lapply(a, function(z) do.call(plotLin, list(x=z$time, y=log2(z$cell.count+1), ids=z$well, 
                                                    rep=z$drug1.conc, main=unique(z$drug1),
                                                    ylab="log2(cell count)")))

par(mfrow=c(3,3))
temp <- lapply(a, function(z) do.call(plotLin, list(x=z$time, y=log2(z$RLU), ids=z$well, 
                                                    rep=z$drug1.conc, main=unique(z$drug1),
                                                    ylab="log2(RLU)")))

LS0tCnRpdGxlOiAiSkFCMDAyLjMgbHVtICYgY2VsbCBjb3VudCBhbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgUmVhbFRpbWUtR2xvIHZzIGRpcmVjdCBjZWxsIGNvdW50cyB2aWEgZmx1b3Jlc2NlbmNlIG1pY3Jvc2NvcHkKQW5hbHlzaXMgb2YgUEM5LjEgY2VsbHMgdHJlYXRlZCB3aXRoIG11bHRpcGxlIGRydWdzIGFuZCBkcnVnIGNvbmNlbnRyYXRpb25zIHVzaW5nIFJULWdsby4KCkNvbHVtbnMgMy0yMiBoYXZlIFJULWdsbywgb3RoZXIgZG8gbm90LiAgCk8xMy0yMiBzaG91bGQgYmUgY29udHJvbHMuCmBgYHtyfQpsaWJyYXJ5KGRpcHJhdGUpCgojIE5ldyBmdW5jdGlvbiB0byBjb3JyZWN0IHRpbWUgZm9ybWF0CiMgRXhhbXBsZSB0aW1lOiAxMi0xNy0yMDIxIDU6MjIgUE0KCmZpeFRpbWUgPC0gZnVuY3Rpb24oLi4uKSBzdHJwdGltZShmb3JtYXQ9IiVtLSVkLSVZICVJOiVNICVwIiwgLi4uKQoKZCA8LSByZWFkLmNzdigifi9kcm9wYm94LXZ1L3RlbXAvbHVtX2NlbGxjb3VudF9KQUIwMDItMy5jc3YiLCByb3cubmFtZXM9MSkKYGBgCgojIyBDbGVhbiB1cCBkYXRhCmBgYHtyfQpkW2QkZHJ1Z19jb25jID09ICJOYU4iLCAiZHJ1Z19jb25jIl0gPC0gTkEKZCRkcnVnX2NvbmMgPC0gYXMubnVtZXJpYyhkJGRydWdfY29uYykKZFtkJGRydWcgPT0gIiIsICJkcnVnIl0gPC0gTkEKCmNuIDwtIGNvbG5hbWVzKGQpCgpjbiA8LSBnc3ViKCJkcnVnXyIsICJkcnVnMS4iLCBjbikKY24gPC0gZ3N1YigiZHJ1ZyQiLCAiZHJ1ZzEiLCBjbikKY24gPC0gZ3N1YigiXyIsICIuIiwgY24pCmNvbG5hbWVzKGQpIDwtIGNuCgpkW2lzLm5hKGQkZHJ1ZzEuY29uYyksICJkcnVnMS5jb25jIl0gPC0gMAoKVHhUaW1lIDwtIGZpeFRpbWUobWluKGQkaW1hZ2UudGltZSkpCmQkdGltZSA8LSBzaWduaWYoYXMubnVtZXJpYyhkaWZmdGltZShmaXhUaW1lKGQkaW1hZ2UudGltZSksIFR4VGltZSwgdW5pdHM9ImhvdXJzIikpLDMpCmQgPC0gZFtvcmRlcihkJHdlbGwsZCR0aW1lKSxdCmQkdWlkIDwtIGQkd2VsbApyb3duYW1lcyhkKSA8LSBOVUxMCgojIGRyb3AgZmlyc3QgdHdvIHRpbWUgcG9pbnRzCmQgPC0gZFtkJHBsYXRlLmlkID4gMixdCmBgYAoKCmBgYHtyfQpjdHJsIDwtIGRbZCR3ZWxsICVpbiUgcGFzdGUwKCJPIiwxMzoyMiksXQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTZ9CnRlbXAgPC0gcGxvdEdDKGN0cmwkdGltZSwgY3RybCRjZWxsLmNvdW50LCBjdHJsJHdlbGwsIG1haW49IkNlbGwgY291bnRzIikKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02fQp0ZW1wIDwtIHBsb3RHQyhjdHJsJHRpbWUsIGN0cmwkUkxVLCBjdHJsJHdlbGwsIG1haW49Ikx1bWluZXNjZW5jZSIpCmBgYAoKCgpgYGB7cn0KcGxvdChSTFUgfiBjZWxsLmNvdW50LCBkYXRhPWN0cmwpCmBgYAoKCmBgYHtyfQpkcnVncyA8LSB1bmlxdWUoZCRkcnVnMSkKZHJ1Z3MgPC0gZHJ1Z3NbIWlzLm5hKGRydWdzKV0KCmEgPC0gbGFwcGx5KGRydWdzLCBmdW5jdGlvbihkcikgZFtkJGRydWcxPT1kciAmICFpcy5uYShkJGRydWcxKSxdKQpgYGAKCgpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQpwYXIobWZyb3c9YygzLDMpKQp0ZW1wIDwtIGxhcHBseShhLCBmdW5jdGlvbih6KSBkby5jYWxsKHBsb3RHQywgYXBwZW5kKGdldEdDYXJncyh6KSwgbGlzdChyZXA9eiRkcnVnMS5jb25jLCBtYWluPXVuaXF1ZSh6JGRydWcxKSkpKSkKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQpwYXIobWZyb3c9YygzLDMpKQp0ZW1wIDwtIGxhcHBseShhLCBmdW5jdGlvbih6KSBkby5jYWxsKHBsb3RHQywgYXBwZW5kKGdldEdDYXJncyh6LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLm5hbWUgPSBjKCJ0aW1lIiwgImNlbGwuY291bnQiLCAiaWRzIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXQuY29sID0gYygidGltZSIsICJSTFUiLCAidWlkIikpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHJlcD16JGRydWcxLmNvbmMsIG1haW49dW5pcXVlKHokZHJ1ZzEpKSkpKQpgYGAKCmBgYHtyfQpwbG90TGluIDwtIGZ1bmN0aW9uICh4LCB5LCBpZHMsIHJlcCA9IGlkcywgY29sb3IgPSBUUlVFLCBsZWcgPSBUUlVFLCAuLi4pIAp7CiAgICB1cmVwIDwtIHVuaXF1ZShyZXApCiAgICBpZmVsc2UoY29sb3IsIHJlcC5jb2wgPC0gZ3Bsb3RzOjpjb2xvcnBhbmVsKG4gPSBsZW5ndGgodXJlcCksIAogICAgICAgIGxvdyA9ICJibHVlIiwgbWlkID0gIm9yYW5nZSIsIGhpZ2ggPSAicmVkIiksIHJlcC5jb2wgPC0gcmVwKCJibGFjayIsIAogICAgICAgIGxlbmd0aCh1cmVwKSkpCiAgICBwbG90KHgsIHksIHR5cGUgPSAibiIsIC4uLikKICAgIGZvciAobXlyZXAgaW4gdXJlcCkgZm9yIChpIGluIHVuaXF1ZShpZHMpKSAKICAgICAgICBsaW5lcyh4W2lkcyA9PSBpICYgcmVwID09IG15cmVwXSwgCiAgICAgICAgICAgICAgeVtpZHMgPT0gaSAmIHJlcCA9PSBteXJlcF0sIAogICAgICAgICAgICAgIGNvbCA9IHJlcC5jb2xbbWF0Y2gobXlyZXAsIHVyZXApXSkKICAgIGlmIChsZWcpIAogICAgICAgIGxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IHVyZXAsIGNvbCA9IHJlcC5jb2wsIGx3ZCA9IDEpCiAgICByZXR1cm4oTlVMTCkKfQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTh9CnBhcihtZnJvdz1jKDMsMykpCnRlbXAgPC0gbGFwcGx5KGEsIGZ1bmN0aW9uKHopIGRvLmNhbGwocGxvdExpbiwgbGlzdCh4PXokdGltZSwgeT1sb2cyKHokY2VsbC5jb3VudCsxKSwgaWRzPXokd2VsbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXA9eiRkcnVnMS5jb25jLCBtYWluPXVuaXF1ZSh6JGRydWcxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWI9ImxvZzIoY2VsbCBjb3VudCkiKSkpCmBgYAoKYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OH0KcGFyKG1mcm93PWMoMywzKSkKdGVtcCA8LSBsYXBwbHkoYSwgZnVuY3Rpb24oeikgZG8uY2FsbChwbG90TGluLCBsaXN0KHg9eiR0aW1lLCB5PWxvZzIoeiRSTFUpLCBpZHM9eiR3ZWxsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcD16JGRydWcxLmNvbmMsIG1haW49dW5pcXVlKHokZHJ1ZzEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYj0ibG9nMihSTFUpIikpKQpgYGAK